package sample3.visitor;

import sample3.evaluators.DivEvaluator;
import sample3.evaluators.IntEvaluator;
import sample3.evaluators.MinusEvaluator;
import sample3.evaluators.ModEvaluator;
import sample3.evaluators.NegationEvaluator;
import sample3.evaluators.PlusEvaluator;
import sample3.evaluators.TimesEvaluator;

public class EvalVisitor implements Visitor {
	int val;

	public int getEvaluation() {
		return val;
	}

	public void visit(DivEvaluator evaluator) {
		evaluator.op1.accept(this);
		int arg1 = getEvaluation();
		evaluator.op2.accept(this);
		int arg2 = getEvaluation();
		val = arg1 / arg2;
	}


	public void visit(MinusEvaluator evaluator) {
		evaluator.op1.accept(this);
		int arg1 = getEvaluation();
		evaluator.op2.accept(this);
		int arg2 = getEvaluation();
		val = arg1 - arg2;
	}

	public void visit(PlusEvaluator evaluator) {
		evaluator.op1.accept(this);
		int arg1 = getEvaluation();
		evaluator.op2.accept(this);
		int arg2 = getEvaluation();
		val = arg1 + arg2;
	}

	public void visit(TimesEvaluator evaluator) {
		evaluator.op1.accept(this);
		int arg1 = getEvaluation();
		evaluator.op2.accept(this);
		int arg2 = getEvaluation();
		val = arg1 * arg2;

	}

	public void visit(ModEvaluator evaluator) {
		evaluator.op1.accept(this);
		int arg1 = getEvaluation();
		evaluator.op2.accept(this);
		int arg2 = getEvaluation();
		val = arg1 % arg2;

	}

	public void visit(NegationEvaluator evaluator) {
		val=evaluator.evaluate();
	}

	public void visit(IntEvaluator evaluator) {
		val=evaluator.evaluate();
	}
}
